iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Software Development

建構跨平台AI對話機器人:從LINE到Telegram實踐SDGs推廣的30天專案紀實系列 第 10

Day 10【LLM 整合】串接大型語言模型:讓機器人具備生成回覆的能力

  • 分享至 

  • xImage
  •  

HI!大家好,我是 Shammi 😊

在昨天開發的時候,AI 對話機器人已經學會了「查閱」知識庫,能夠從海量資訊中精準地找出最相關的 SDGs 內容。

BUT!還不能用人類的語言來回答問題!

今天的篇幅是把這份「參考資料」傳遞給我們的機器人的大腦—>大型語言模型(LLM),讓它根據這些資訊來生成一個完整且流暢的回覆。

這也是此專案中RAG 架構中最重要的一環:生成(Generation)

接著開始吧!

🌐 一、LLM 在 RAG 架構中的角色

傳統的 LLM 容易出現「一本正經地胡說八道」(hallucination)的問題,也就是憑空捏造不存在的資訊。而在 RAG 架構中,LLM 的角色不再是憑空想像,而是:

  • 接收:使用者提出的問題。
  • 接收:Day 9 檢索出來的「參考資料」(也就是 retrieved_chunks)。
  • 生成:一個結合了問題與參考資料的精準答案

這樣一來,LLM 的回答就有了可靠的依據,大幅降低了胡說八道的風險,也讓我們的 AI 機器人變得更加值得信賴。為此,我們將選擇 Gemini 1.5 Flash 模型。它是一款由 Google 推出的輕量級、高效率模型,特別適合即時問答等需要快速回應的場景。它不僅速度快、成本低,還繼承了超長的上下文視窗,能完美應對我們的 RAG 應用。此外,它也提供了慷慨的免費額度,非常適合我們的開發與學習用途。

🌐 二、實作教學:整合 Gemini Flash 並生成回覆

接下來,我們將使用 Gemini 1.5 Flash 模型,實現這個生成回覆的功能。Gemini Flash 以其輕量級和快速的特性,非常適合即時問答應用。
因此,在個人專案的應用下,我們選擇 Gemini 1.5 Flash 模型。它是一款由 Google 推出的輕量級、高效率模型,特別適合即時問答等需要快速回應的場景。它不僅速度快、成本低,還繼承了超長的上下文視窗,能完美應對我們的 RAG 應用。此外,它也提供了慷慨的免費額度,非常適合此專案小小的開發與學習用途。

步驟 1:定義 LLM 串接函式

先定義一個函式,讓它接收「問題」和「參考資料」作為輸入,並將它們組合成一個完整的 Prompt(提示詞),然後傳給 Gemini Flash 模型。

import google.generativeai as genai
from google.colab import userdata

GOOGLE_API_KEY = userdata.get('GOOGLE_API_KEY')
genai.configure(api_key=GOOGLE_API_KEY)

model = genai.GenerativeModel('gemini-1.5-flash')

def generate_response(query, retrieved_chunks):
    """
    將使用者問題與檢索出的內容組合成 Prompt,並傳給 LLM 進行生成。
    """
    # 將檢索出的內容格式化為一個字串
    context = "\n---\n".join(retrieved_chunks)
    
    system_prompt = (
        "你是一個名為阿米的孩子,個性純真、善良,且充滿愛與同理心。\n"
        "你的任務是根據提供的資料,用溫暖、親切、簡潔而深刻的口氣,引導使用者認識 SDGs 的應用。\n"
    )

    prompt = f"""
    {system_prompt}
    請根據以下提供的參考資料,簡潔且精準地回答使用者的問題。
    如果參考資料中沒有相關資訊,請禮貌地告知使用者,並鼓勵他們提出與 SDGs 相關的問題。

    使用者問題:{query}

    參考資料:
    {context}
    """
    
    response = model.generate_content(prompt)

    #傳回模型的回答
    return response.text

這段程式碼較著重於[system_prompt],如果讀者們要製作自己的對話機器人,可以運用項目的方式,來訓練對話機器人,項目的方向可設定角色、任務、個性等,提供給讀者們參考。

步驟 2:執行完整的 RAG 流程

再來是檢索功能與生成函式結合,主要可以用來看看確認對話機器人能否正確回答問題。

def get_rag_answer(query):
    #step1.將問題向量化
    query_vector = get_embedding(query)

    #step2.在FAISS索引中搜尋
    distances, indices = index.search(query_vector, k=3)

    #step3.取得最相關的原始內容
    retrieved_chunks = [stored_chunks[i] for i in indices[0]]

    #step4.傳給 LLM 產生最終回覆(生成)
    final_answer = generate_response(query, retrieved_chunks)

    return final_answer

步驟 3:測試動態回覆

接下來,使用 get_rag_answer 函式來測試不同的問題,它將會動態地去搜尋最相關的答案。

#測試第一個問題
user_query_1 = "永續利用海洋資源有哪些具體目標?" #可以自行更改問題哦。
answer_1 = get_rag_answer(user_query_1)
print(f"使用者問題:{user_query_1}")
print("---")
print("阿米回答:") #我自己將此機器人命名阿米,較有互動感。
print(answer_1)
print("\n")

#測試第二個問題
user_query_2 = "氣候變遷有什麼應對措施?" #可以自行更改問題哦。
answer_2 = get_rag_answer(user_query_2)
print(f"使用者問題:{user_query_2}")
print("---")
print("阿米回答:")
print(answer_2)

參考結果:
https://ithelp.ithome.com.tw/upload/images/20250908/20151627IsHQ60HQWH.jpg

總結

經過10天不間斷的發文,如果讀者們有跟著我的腳步操作與理解的話,就完成了 AI 機器人專案的最後一塊拼圖:整合大型語言模型。從現在開始,我們的機器天人不僅能找到資訊,還能用專業且可靠的方式來回答問題。

整個 RAG 架構從 PDF 資料處理到最終生成答案的流程,已經完整串接起來。明天,再來建立基本的對話流程與回覆格式化,讓機器人能「說人話」吧!

有機會再分享為什麼機器人要叫「阿米」吧/images/emoticon/emoticon37.gif


上一篇
Day 9【檢索機制】實作檢索功能:讓機器人具備「查閱」能力
下一篇
Day 11【對話邏輯】 建立基本的對話流程與回覆格式化,讓機器人能「說人話」
系列文
建構跨平台AI對話機器人:從LINE到Telegram實踐SDGs推廣的30天專案紀實20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言